Mở khóa sức mạnh của Pandas GroupBy để phân tích dữ liệu. Hướng dẫn này khám phá các kỹ thuật tổng hợp và biến đổi với các ví dụ thực tế cho dữ liệu quốc tế.
Làm chủ các thao tác GroupBy trong Pandas: Tổng hợp vs. Biến đổi
Pandas, nền tảng của thao tác dữ liệu trong Python, cung cấp một công cụ mạnh mẽ để phân tích và hiểu dữ liệu: thao tác GroupBy. Tính năng này cho phép bạn phân chia dữ liệu của mình thành các nhóm dựa trên các đặc điểm chung và sau đó áp dụng các hàm cho các nhóm này, tiết lộ những hiểu biết sâu sắc mà nếu không sẽ vẫn ẩn. Bài viết này đi sâu vào hai thao tác GroupBy chính: tổng hợp và biến đổi, cung cấp các ví dụ và giải thích thực tế phù hợp cho các chuyên gia dữ liệu trên toàn thế giới.
Tìm hiểu về Khái niệm GroupBy
Về cốt lõi, GroupBy là một quá trình bao gồm ba bước chính: tách dữ liệu thành các nhóm dựa trên một hoặc nhiều tiêu chí, áp dụng một hàm cho từng nhóm một cách độc lập và kết hợp các kết quả thành một cấu trúc dữ liệu mới. Chiến lược "tách-áp dụng-kết hợp" này là một khái niệm cơ bản trong phân tích dữ liệu và cung cấp một khuôn khổ linh hoạt để khám phá các tập dữ liệu phức tạp.
Sức mạnh của GroupBy nằm ở khả năng xử lý các loại và cấu trúc dữ liệu khác nhau, làm cho nó có thể áp dụng trên nhiều lĩnh vực khác nhau. Cho dù bạn đang phân tích dữ liệu bán hàng từ nhiều khu vực, số liệu cảm biến từ các thiết bị khác nhau hay hoạt động trên mạng xã hội trên các nhóm nhân khẩu học, GroupBy có thể giúp bạn trích xuất những hiểu biết sâu sắc có ý nghĩa.
Tổng hợp: Tóm tắt dữ liệu trong các nhóm
Tổng hợp là quá trình tính toán các số liệu thống kê tóm tắt cho từng nhóm. Các số liệu thống kê này cung cấp một cái nhìn tổng quan ngắn gọn về các đặc điểm của nhóm, cho phép bạn so sánh và đối chiếu các phân đoạn khác nhau của dữ liệu của mình. Các hàm tổng hợp phổ biến bao gồm:
sum(): Tính tổng các giá trị trong mỗi nhóm.mean(): Tính giá trị trung bình trong mỗi nhóm.median(): Tính giá trị giữa trong mỗi nhóm.min(): Tìm giá trị tối thiểu trong mỗi nhóm.max(): Tìm giá trị tối đa trong mỗi nhóm.count(): Đếm số lượng giá trị không rỗng trong mỗi nhóm.size(): Trả về kích thước của mỗi nhóm (bao gồm cả giá trị null).std(): Tính độ lệch chuẩn trong mỗi nhóm.var(): Tính phương sai trong mỗi nhóm.
Ví dụ thực tế về Tổng hợp
Hãy xem xét một tập dữ liệu về dữ liệu bán hàng quốc tế cho một công ty thương mại điện tử giả định. Dữ liệu bao gồm thông tin về danh mục sản phẩm, quốc gia bán hàng và số tiền bán hàng.
import pandas as pd
# Sample data
data = {
'Category': ['Electronics', 'Clothing', 'Electronics', 'Clothing', 'Home Goods', 'Electronics', 'Clothing', 'Home Goods'],
'Country': ['USA', 'UK', 'Canada', 'USA', 'Germany', 'UK', 'Canada', 'Germany'],
'Sales': [100, 50, 75, 60, 80, 90, 45, 70]
}
df = pd.DataFrame(data)
print(df)
Điều này sẽ xuất ra:
Category Country Sales
0 Electronics USA 100
1 Clothing UK 50
2 Electronics Canada 75
3 Clothing USA 60
4 Home Goods Germany 80
5 Electronics UK 90
6 Clothing Canada 45
7 Home Goods Germany 70
Ví dụ 1: Tính tổng doanh số trên mỗi danh mục
Để tính tổng doanh số cho từng danh mục sản phẩm, chúng ta có thể sử dụng phương thức groupby() sau đó là hàm tổng hợp sum().
category_sales = df.groupby('Category')['Sales'].sum()
print(category_sales)
Điều này sẽ xuất ra:
Category
Clothing 155
Electronics 265
Home Goods 150
Name: Sales, dtype: int64
Ví dụ 2: Tính doanh số trung bình trên mỗi quốc gia
Tương tự, để tính doanh số trung bình trên mỗi quốc gia, chúng ta có thể sử dụng hàm tổng hợp mean().
country_sales = df.groupby('Country')['Sales'].mean()
print(country_sales)
Điều này sẽ xuất ra:
Country
Canada 60.0
Germany 75.0
UK 70.0
USA 80.0
Name: Sales, dtype: float64
Ví dụ 3: Sử dụng nhiều hàm tổng hợp
Pandas cho phép bạn áp dụng nhiều hàm tổng hợp đồng thời bằng cách sử dụng phương thức agg(). Điều này cung cấp một bản tóm tắt toàn diện về các đặc điểm của nhóm.
category_summary = df.groupby('Category')['Sales'].agg(['sum', 'mean', 'median', 'count'])
print(category_summary)
Điều này sẽ xuất ra:
sum mean median count
Category
Clothing 155 51.666667 50.0 3
Electronics 265 88.333333 90.0 3
Home Goods 150 75.000000 75.0 2
Ví dụ 4: Các hàm tổng hợp tùy chỉnh
Bạn cũng có thể xác định các hàm tổng hợp tùy chỉnh của riêng mình bằng cách sử dụng các biểu thức lambda hoặc các hàm được đặt tên. Điều này cho phép bạn tính toán các số liệu thống kê cụ thể không có sẵn trong các hàm tổng hợp tiêu chuẩn.
# Custom function to calculate the range (max - min)
def custom_range(x):
return x.max() - x.min()
category_summary = df.groupby('Category')['Sales'].agg(['sum', 'mean', custom_range])
print(category_summary)
Điều này sẽ xuất ra:
sum mean custom_range
Category
Clothing 155 51.666667 15
Electronics 265 88.333333 25
Home Goods 150 75.000000 10
Biến đổi: Sửa đổi dữ liệu trong các nhóm
Mặt khác, biến đổi liên quan đến việc sửa đổi dữ liệu trong mỗi nhóm dựa trên một số phép tính. Không giống như tổng hợp, trả về một giá trị tóm tắt cho mỗi nhóm, biến đổi trả về một giá trị cho mỗi hàng trong dữ liệu gốc, nhưng giá trị được tính dựa trên nhóm mà hàng đó thuộc về. Các thao tác biến đổi giữ nguyên chỉ mục và hình dạng ban đầu của DataFrame.
Các trường hợp sử dụng phổ biến cho biến đổi bao gồm:
- Tiêu chuẩn hóa dữ liệu trong mỗi nhóm.
- Tính toán thứ hạng hoặc phần trăm trong mỗi nhóm.
- Điền các giá trị bị thiếu dựa trên số liệu thống kê nhóm.
Ví dụ thực tế về Biến đổi
Hãy tiếp tục với dữ liệu bán hàng quốc tế của chúng tôi. Chúng ta có thể áp dụng biến đổi để thực hiện các phép tính liên quan đến số liệu bán hàng trong mỗi quốc gia.
Ví dụ 1: Tiêu chuẩn hóa dữ liệu bán hàng trong mỗi quốc gia (Z-score)
Tiêu chuẩn hóa dữ liệu liên quan đến việc chuyển đổi các giá trị để có giá trị trung bình là 0 và độ lệch chuẩn là 1. Điều này rất hữu ích để so sánh dữ liệu trên các thang đo và phân phối khác nhau. Chúng ta có thể sử dụng phương thức transform() cùng với một biểu thức lambda để đạt được điều này.
from scipy.stats import zscore
df['Sales_Zscore'] = df.groupby('Country')['Sales'].transform(zscore)
print(df)
Điều này sẽ xuất ra:
Category Country Sales Sales_Zscore
0 Electronics USA 100 1.000000
1 Clothing UK 50 -1.000000
2 Electronics Canada 75 1.000000
3 Clothing USA 60 -1.000000
4 Home Goods Germany 80 1.000000
5 Electronics UK 90 1.000000
6 Clothing Canada 45 -1.000000
7 Home Goods Germany 70 -1.000000
Cột Sales_Zscore hiện chứa các giá trị doanh số đã được chuẩn hóa cho từng quốc gia. Các giá trị trên 0 cao hơn mức doanh số trung bình cho quốc gia đó và các giá trị dưới 0 thấp hơn mức trung bình.
Ví dụ 2: Tính thứ hạng bán hàng trong mỗi danh mục
Để tính thứ hạng của từng doanh số trong danh mục của nó, chúng ta có thể sử dụng phương thức rank() trong hàm transform().
df['Sales_Rank'] = df.groupby('Category')['Sales'].transform(lambda x: x.rank(method='dense'))
print(df)
Điều này sẽ xuất ra:
Category Country Sales Sales_Zscore Sales_Rank
0 Electronics USA 100 1.000000 3.0
1 Clothing UK 50 -1.000000 2.0
2 Electronics Canada 75 1.000000 1.0
3 Clothing USA 60 -1.000000 3.0
4 Home Goods Germany 80 1.000000 2.0
5 Electronics UK 90 1.000000 2.0
6 Clothing Canada 45 -1.000000 1.0
7 Home Goods Germany 70 -1.000000 1.0
Cột Sales_Rank cho biết thứ hạng của từng doanh số trong danh mục tương ứng của nó. Đối số `method='dense'` đảm bảo rằng các thứ hạng liên tiếp được gán mà không có khoảng trống.
Ví dụ 3: Điền các giá trị bị thiếu dựa trên giá trị trung bình của nhóm
Hãy đưa ra một số giá trị bị thiếu trong dữ liệu bán hàng và sau đó điền chúng dựa trên doanh số trung bình cho mỗi quốc gia.
import numpy as np
# Introduce missing values
df.loc[[0, 3], 'Sales'] = np.nan
print(df)
# Fill missing values based on country mean
df['Sales_Filled'] = df['Sales'].fillna(df.groupby('Country')['Sales'].transform('mean'))
print(df)
DataFrame ban đầu với các giá trị bị thiếu sẽ trông như thế này:
Category Country Sales Sales_Zscore Sales_Rank
0 Electronics USA NaN 1.000000 3.0
1 Clothing UK 50 -1.000000 2.0
2 Electronics Canada 75 1.000000 1.0
3 Clothing USA NaN -1.000000 3.0
4 Home Goods Germany 80 1.000000 2.0
5 Electronics UK 90 1.000000 2.0
6 Clothing Canada 45 -1.000000 1.0
7 Home Goods Germany 70 -1.000000 1.0
Và sau khi điền các giá trị bị thiếu:
Category Country Sales Sales_Zscore Sales_Rank Sales_Filled
0 Electronics USA NaN 1.000000 3.0 NaN
1 Clothing UK 50 -1.000000 2.0 50.0
2 Electronics Canada 75 1.000000 1.0 75.0
3 Clothing USA NaN -1.000000 3.0 NaN
4 Home Goods Germany 80 1.000000 2.0 80.0
5 Electronics UK 90 1.000000 2.0 90.0
6 Clothing Canada 45 -1.000000 1.0 45.0
7 Home Goods Germany 70 -1.000000 1.0 70.0
Lưu ý quan trọng: Vì không có giá trị trung bình hiện có cho `USA` nên các giá trị kết quả trong `Sales_Filled` là `NaN`. Việc xử lý các trường hợp ngoại lệ như thế này là rất quan trọng để phân tích dữ liệu đáng tin cậy và nên được xem xét trong quá trình triển khai.
Tổng hợp vs. Biến đổi: Sự khác biệt chính
Mặc dù cả tổng hợp và biến đổi đều là các thao tác GroupBy mạnh mẽ, chúng phục vụ các mục đích khác nhau và có các đặc điểm riêng biệt:
- Hình dạng đầu ra: Tổng hợp làm giảm kích thước của dữ liệu, trả về một giá trị duy nhất cho mỗi nhóm. Biến đổi giữ nguyên kích thước dữ liệu ban đầu, trả về một giá trị được biến đổi cho mỗi hàng.
- Mục đích: Tổng hợp được sử dụng để tóm tắt dữ liệu và hiểu rõ hơn về các đặc điểm của nhóm. Biến đổi được sử dụng để sửa đổi dữ liệu trong các nhóm, thường là để chuẩn hóa hoặc chuẩn hóa.
- Giá trị trả về: Tổng hợp trả về một DataFrame hoặc Series mới với các giá trị được tổng hợp. Biến đổi trả về một Series với các giá trị được biến đổi, sau đó có thể được thêm làm một cột mới vào DataFrame gốc.
Việc lựa chọn giữa tổng hợp và biến đổi phụ thuộc vào mục tiêu phân tích cụ thể của bạn. Nếu bạn cần tóm tắt dữ liệu và so sánh các nhóm, tổng hợp là lựa chọn phù hợp. Nếu bạn cần sửa đổi dữ liệu trong các nhóm trong khi vẫn giữ nguyên cấu trúc dữ liệu gốc, biến đổi là một lựa chọn tốt hơn.
Các kỹ thuật GroupBy nâng cao
Ngoài tổng hợp và biến đổi cơ bản, Pandas GroupBy cung cấp một loạt các kỹ thuật nâng cao để phân tích dữ liệu tinh vi hơn.
Áp dụng các hàm tùy chỉnh với apply()
Phương thức apply() cung cấp tính linh hoạt nhất, cho phép bạn áp dụng bất kỳ hàm tùy chỉnh nào cho từng nhóm. Hàm này có thể thực hiện bất kỳ thao tác nào, bao gồm tổng hợp, biến đổi hoặc thậm chí các phép tính phức tạp hơn.
def custom_function(group):
# Calculate the sum of sales for each category in a group, only if there is more than one row in the group
if len(group) > 1:
group['Sales_Sum'] = group['Sales'].sum()
else:
group['Sales_Sum'] = 0 # Or some other default value
return group
df_applied = df.groupby('Country').apply(custom_function)
print(df_applied)
Trong ví dụ này, chúng ta xác định một hàm tùy chỉnh tính tổng doanh số trong mỗi nhóm (quốc gia). Phương thức apply() áp dụng hàm này cho từng nhóm, dẫn đến một cột mới chứa tổng doanh số cho nhóm đó.
Lưu ý quan trọng: Hàm apply có thể tốn nhiều tài nguyên tính toán hơn các phương thức khác. Tối ưu hóa mã của bạn và xem xét các cách triển khai thay thế khi làm việc với các tập dữ liệu lớn.
Nhóm theo nhiều cột
Bạn có thể nhóm dữ liệu của mình theo nhiều cột để tạo ra các phân đoạn chi tiết hơn. Điều này cho phép bạn phân tích dữ liệu dựa trên giao điểm của nhiều đặc điểm.
category_country_sales = df.groupby(['Category', 'Country'])['Sales'].sum()
print(category_country_sales)
Điều này sẽ nhóm dữ liệu theo cả Category và Country, cho phép bạn tính tổng doanh số cho từng danh mục trong mỗi quốc gia. Điều này cung cấp một cái nhìn chi tiết hơn về hiệu suất bán hàng trên các khu vực và dòng sản phẩm khác nhau.
Lặp qua các nhóm
Để phân tích phức tạp hơn, bạn có thể lặp qua các nhóm bằng vòng lặp for. Điều này cho phép bạn truy cập từng nhóm riêng lẻ và thực hiện các thao tác tùy chỉnh trên đó.
for name, group in df.groupby('Category'):
print(f"Category: {name}")
print(group)
Thao tác này sẽ lặp qua từng danh mục sản phẩm và in dữ liệu tương ứng. Điều này có thể hữu ích để thực hiện phân tích tùy chỉnh hoặc tạo báo cáo cho từng danh mục.
Các phương pháp hay nhất để sử dụng GroupBy
Để đảm bảo việc sử dụng GroupBy hiệu quả và hiệu quả, hãy xem xét các phương pháp hay nhất sau:
- Hiểu dữ liệu của bạn: Trước khi áp dụng
GroupBy, hãy dành thời gian để hiểu dữ liệu của bạn và xác định các tiêu chí nhóm và các hàm tổng hợp/biến đổi có liên quan. - Chọn đúng thao tác: Cẩn thận xem xét liệu tổng hợp hay biến đổi là lựa chọn phù hợp cho mục tiêu phân tích của bạn.
- Tối ưu hóa hiệu suất: Đối với các tập dữ liệu lớn, hãy xem xét việc tối ưu hóa mã của bạn bằng cách sử dụng các thao tác vectơ hóa và tránh các vòng lặp không cần thiết.
- Xử lý các giá trị bị thiếu: Hãy nhận biết các giá trị bị thiếu trong dữ liệu của bạn và xử lý chúng một cách thích hợp bằng cách sử dụng các phương pháp như
fillna()hoặcdropna(). - Tài liệu hóa mã của bạn: Tài liệu hóa rõ ràng mã của bạn để giải thích mục đích của từng thao tác
GroupByvà lý do đằng sau các lựa chọn của bạn.
Kết luận
Pandas GroupBy là một công cụ mạnh mẽ để phân tích dữ liệu, cho phép bạn phân đoạn dữ liệu của mình, áp dụng các hàm cho từng nhóm và trích xuất những hiểu biết sâu sắc có giá trị. Bằng cách làm chủ các kỹ thuật tổng hợp và biến đổi, bạn có thể mở khóa toàn bộ tiềm năng của dữ liệu của mình và hiểu sâu hơn về các mẫu và xu hướng cơ bản. Cho dù bạn đang phân tích dữ liệu bán hàng, số liệu cảm biến hay hoạt động trên mạng xã hội, GroupBy có thể giúp bạn đưa ra các quyết định dựa trên dữ liệu và đạt được các mục tiêu phân tích của mình. Nắm bắt sức mạnh của GroupBy và nâng cao kỹ năng phân tích dữ liệu của bạn lên một tầm cao mới.
Hướng dẫn này đã cung cấp một cái nhìn tổng quan toàn diện về các thao tác Pandas GroupBy với trọng tâm là Tổng hợp vs. Biến đổi. Bằng cách sử dụng các kỹ thuật này trên dữ liệu quốc tế, các nhà khoa học dữ liệu trên toàn thế giới có thể trích xuất những hiểu biết kinh doanh quan trọng trên các tập dữ liệu đa dạng. Thực hành, thử nghiệm và điều chỉnh các kỹ thuật này theo nhu cầu cụ thể của bạn để tận dụng tối đa tiềm năng của Pandas.